import dayjs from 'dayjs'

/**
 * 计算两个日期之间的天数差
 *
 * @param start - 起始日期字符串，支持 dayjs 可解析的格式，如 '2021-12-25'
 * @param end - 结束日期字符串，支持 dayjs 可解析的格式，如 '2022-06-19'
 * @param includeStart - 是否包含起始日期，默认为 false
 *                        若为 true，则计算的天数差包括起始日本身
 * @returns 两个日期之间的天数差，类型为数字
 *
 * @throws {Error} 当 `start` 不是有效日期字符串时抛出错误
 * @throws {Error} 当 `end` 不是有效日期字符串时抛出错误
 *
 * @example
 * ```ts
 * getDaysBetween('2021-12-25', '2021-12-30')           // 5
 * getDaysBetween('2021-12-25', '2021-12-30', true)     // 6
 * getDaysBetween('2022-06-01', '2022-06-01', true)     // 1
 * ```
 */
export function getDaysBetween(start: string, end: string, includeStart = false): number {
  const startDate = dayjs(start)
  const endDate = dayjs(end)

  if (!startDate.isValid()) {
    throw new Error(`[getDaysBetween] 非法的起始日期: ${start}`)
  }
  if (!endDate.isValid()) {
    throw new Error(`[getDaysBetween] 非法的结束日期: ${end}`)
  }

  const diff = endDate.diff(startDate, 'day')
  return includeStart ? diff + 1 : diff
}

export default getDaysBetween
